<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        //1. 先创建 promise 的构造函数，该构造函数有一个参数，这个参数是个函
        //数，我们一般叫执行函数 (executor function)；为执行函数再创建两个参
        //数，这两个参数也是函数，作用是可以改变 promise 的状态。
        function Promise(executor){
            executor(resolve,reject);
            function resolve(){}
            function reject(){}
        }

        //2. 改造步骤 1 的代码，实现状态的改变。promise 的三种状态: pending-等 待, resolve-成功, reject-失败, 其中最开始为 pending 状态, 并且一旦
        //成功或者失败, Promise 的状态便不会再改变。我们增加一个变量$$status
        //来记录 promise 的状态。
        function Promise(executor){
            let_this = this;
            _this.$$status = 'pending';
            executor(resolve.bind(this),reject.bind(this));
            function resolve(){
                if (_this.$$status==='pending'){
                    _this.$$status = 'full'
                }
            }
            function reject(){
                if (_this.$$status === 'pending'){
                    _this.s$status = 'fail'
                }
            }
        }

        //3. 接着实现 then。我们在 Promise 的原型上设置 then 函数，它有两个参
        //数，full 表示当状态变为成功时要执行的回调函数，fail 表示当状态失败
        //时要执行的回调函数。
        Promise.prototype.then = function(full, fail){
            this.successCallback = full
            this.failCallBack = fail
        };

        //4. 回到步骤 2 的代码中进行完善，增加两个回调函数 successCallback 和
        //failCallBack，并且为 resolve 和 reject 增加一个参数，这样就能传递数
        //据了。
        function Promise(executor){
            let_this =this;
            _this.$$status = 'pending';
            _this. failcallBack =- undefined;
            _this.successCallback = undefined;
            _this.error = undefined;
            executor(resolve.bind(_this), reject.bind(_this));

            function resolve(params){
                if (_this.$$status === 'pending'){
                    _this.$$status = 'success'
                    _this.successCallback(params)
                }
            }
            function reject(params){
                if (_this.$$status === 'pending'){
                    _this.$$status = 'fail'
                    _this. failcallBack(params)
                } 
            } 
        }

       // 5. 编写一段测试代码，测试你自己写的“promise”对象。
       new Promise(function(res, rej){
            setTimeout(()=>res('成功'),0);
        }).then(result => console.log(result));
    </script>
</body>
</html>